package main
/*
原生操作系统内存管理
#1、小内存频繁申请会造成内存碎片
#2、从用户态到内核态 频繁创建和销毁 消耗资源

go内存管理本质上就是一个内存池
go先申请一块大的内存，然后自行管理

基本概念：
page：go向操作系统申请和释放都是以页为单位，一个page 8k的内存的空间
span：一个或多个连续的page组成一个span。不同类型的span可以分配不同大小的对象。span是go进行内存管理的基本单位
sizeclass：空间规格，每个span都带有一个sizeclass，标记着该span中的page如何使用
object：对象，用来存储一个变量的内存空间，一个span初始化时，会分割成一堆等大小的object

管理组件：mheap mcentral mcache
mheap：最外层go语言管理的内存池，拥有不同类型的span
mcache：每一个mcache和处理器p对应，mcache也有自己的span

多线程申请同一个资源，会带来锁开销。所以每个线程都有自己的缓存(mcache)，分配和释放都只是当前线程访问，就不需要加锁

go申请小对象内存时: 16b-32k
向mcache中取申请分配，如果mcache中没有可用的span，再去mcentral中获取，如果mcentral中没有相应规格大小的span，则向mheap申请
如果mheap中也没有合适大小的span则向操作系统申请

<16B对象，使用mcache的tiny分配器分配
>32k，直接向mheap上分配

mcentral相当于 mcache与mheap之间的缓存层
 */

